#ifndef MENUS_H
#   define MENUS_H


#include "base_donnees.h"
#include "etat_partie.h"

#include "constantes_et_macros.h"


/**
 * \file menus.h
 * Ce module permet, en association avec le module affichage,
 * de creer et d'utiliser des menus a base de texte.\n\n
 *
 * Exemple d'utilisation :\n\n
 *
 * demarrer_texte();
 *
 * struct menu_texte menu;\n
 * fenetre_texte* fenetre;\n
 * char saisie;\n
 *
 * fenetre = ouvrir_fenetre_texte(20, 15, 3, 10);
 *
 * init_menu_texte(&menu, 5, 3, "Titre menu", fenetre);\n
 * ajouter_choix(&menu, "Choix 1", 1);\n
 * ajouter_choix(&menu, "Choix 2", 2);\n
 * ajouter_choix(&menu, "Choix 3", 3);\n
 * ajouter_choix(&menu, "Choix 4", 4);\n
 * ajouter_choix(&menu, "Choix 5", 5);
 *
 *
 * do\n
 * {\n
 *      vider_fenetre_texte(fenetre);\n
 *      afficher_menu_texte(&menu);\n
 *      saisie = saisir_menu_texte(&menu);\n
 * } while(saisie != ENTREE);
 *
 * detruire_menu_texte(&menu);\n
 * fermer_fenetre_texte(fenetre);
 *
 * arreter_texte();
 *
 *
 *
 * Notez que lorsque l'on doit superposer plusieurs fenetres, il est
 * convenable de decaler chaque nouvelle fenetre de 6
 * caracteres en x et 3 en y :
 *
 * Premiere fenetre : apparition en (1 ; 1)
 * Deuxieme fenetre : apparition en (7 ; 4)
 * Troisieme fenetre : apparition en (13 ; 7)
 * Puis (19 ; 10), (25 ; 13) ...
 */




/**
 * \struct choix menus.h
 * Un element d'un menu_texte
 */
struct choix
{
    /**
     * texte affiche a l'ecran et permettant a
     * l'utilisateur de faire son choix
     */
    char texte[128];
    /** valeur entiere associee au choix */
    int valeur;
};



/**
 * \struct menu_texte menus.h
 * Une structure permettant de creer des menus
 * afin que l'utilisateur puisse faire des choix
 */
struct menu_texte
{
    /**
     * pointeur vers le premier choix
     * (il s'agit d'un tableau dynamique)
     */
     struct choix* tab;
     /**
      * Nb choix est mis a 0 lors de l'initialisation du menu, et sert a savoir
      * combien de choix y ont ete entres
      */
     unsigned int nb_choix;
     /** L'indice, dans tab, du choix etant le premier de ceux affiches */
     unsigned int indice_premier_choix;
     /** nombre de choix pouvant etre affiches simultanement */
     unsigned int nb_choix_affiches;
     /** indice du choix actuellement selectionne */
     unsigned int position_curseur;
     /** titre du menu expliquant a l'utilisateur ce qu'il doit faire */
     char titre[128];
     /** adresse de la fenetre dans laquelle s'affiche le menu */
     fenetre_texte* fenetre;
};



/**
 * \fn char menu_bataille(void)
 * \brief Menu de pause utilise lors des batailles
 *
 * \return PAS_TERMINEE si le joueur souhaite continuer, DEFAITE sinon
 *
 * \warning Toutes les fonctions commencant par "menu" doivent etre
 *          appelees APRES avoir appele demarrer_texte ! Elles ne le feront pas !
 */
char menu_bataille(void);



/**
 * \fn char menu_carte_monde(struct etat_partie* partie,
                             const struct base_donnees* donnees)
 * \brief Permet au joueur d'acceder a d'autres menus, de
 *        continuer la partie, ou d'abandonner l'exploration en cours
 *
 * \param[in,out] partie L'adresse de l'etat de la partie
 * \param[in] donnees L'adresse d'une base de donnees correctement remplie
 * \return -1 si le joueur souhaite quitter le jeu, 0 sinon
 *
 * \warning Toutes les fonctions commencant par "menu" doivent etre
 *          appelees APRES avoir appele demarrer_texte ! Elles ne le feront pas !
 */
char menu_carte_monde(struct etat_partie* partie,
                      const struct base_donnees* donnees);



/**
 * \fn char menu_exploration(struct etat_partie* partie,
                             const struct base_donnees* donnees)
 * \brief Permet au joueur d'acceder a d'autres menus, de
 *        continuer la partie, ou d'abandonner l'exploration en cours
 *
 * \param[in,out] partie L'adresse de l'etat de la partie
 * \param[in] donnees L'adresse d'une base de donnees correctement remplie
 * \return -1 si le joueur abandonne l'exploration, 0 sinon
 *
 * \warning Toutes les fonctions commencant par "menu" doivent etre
 *          appelees APRES avoir appele demarrer_texte ! Elles ne le feront pas !
 */
char menu_exploration(struct etat_partie* partie,
                      const struct base_donnees* donnees);



/**
 * \fn void menu_equipement(struct etat_partie* partie,
                            const struct base_donnees* donnees)
 * \brief Permet au joueur de choisir quels objets equiper
 *
 * \param[in,out] partie L'adresse de l'etat de la partie
 * \param[in] donnees L'adresse d'une base de donnees correctement remplie
 *
 * \warning Toutes les fonctions commencant par "menu" doivent etre
 *          appelees APRES avoir appele demarrer_texte ! Elles ne le feront pas !
 */
void menu_equipement(struct etat_partie* partie,
                     const struct base_donnees* donnees);



/**
 * \fn void menu_ameliorer_competences(struct etat_partie* partie,
                                       unsigned int nb_points)
 * \brief Permet au joueur de distribuer des points de
 *        competences afin d'ameliorer les stats du personnage
 *
 * \param[in,out] partie L'adresse de l'etat de la partie
 * \param[in] nb_points Le nombre de points a distribuer
 *
 * Cette fonction est a appeler apres un "level up", avec
 * nb_points =
 * nombre de niveaux passes (presque toujours un seul) * NB_POINTS_PAR_NIVEAU
 *
 * \warning Toutes les fonctions commencant par "menu" doivent etre
 *          appelees APRES avoir appele demarrer_texte ! Elles ne le feront pas !
 */
void menu_ameliorer_competences(struct etat_partie* partie,
                                unsigned int nb_points);



/**
 * \fn void menu_choisir_categorie(struct etat_partie* partie,
                                   const char menu_suivant,
                                   const struct base_donnees* donnees)
 * \brief Permet au joueur de choisir un type d'objet ou de ne rien faire,
 *        Puis lance le menu de vente, d'achat ou de quetes avec
 *        le type choisi si le joueur n'a pas choisi "retour'.
 *
 * \param[in,out] partie L'adresse de l'etat de la partie
 * \param[in] menu_suivant 'a' pour achat, 'v' pour vente, 'q' pour quetes
 * \param[in] donnees Une base de donnees correctement remplie
 *
 * \warning Une valeur invalide de menu_suivant provoquera une erreur.
 */
void menu_choisir_categorie(struct etat_partie* partie,
                            const char menu_suivant,
                            const struct base_donnees* donnees);



/**
 * \fn char menu_principal(struct etat_partie* partie,
                           const struct base_donnees* donnees)
 * \brief Permet au joueur de commencer une nouvelle partie,
 *        d'en charger une, de consulter l'aide du jeu, ou encore de quitter
 *
 * \param[out] partie L'adresse de l'etat_partie qui sera
 *                    rempli si le joueur ne quitte pas
 * \param[in] donnees Une base de donnees correctement remplie
 * \return QUITTER si le joueur quitte, JOUER sinon.
 */
char menu_principal(struct etat_partie* partie,
                    const struct base_donnees* donnees);



#endif /* MENUS_H */
